<?
/**
 * Класс простейшей "ключ-значение" базы данных
 * @author Alexander NeonXP Kiryukhin
 * @copyright 2011 Alexander NeonXP Kiryukhin
 * @license GPLv2
 */
 
/* Формат конфига simpledb.json
 * db: движок бд. Пока только simpledb. Если и он в данный момент не нужен, то оставить пустым.
 * dbfile: файл для хранения БД simpledb
 * dbautocommit: промежуток в секундах, через который нужно сбрасывать БД из памяти в файл. Стоит ставить пореже, т.к. операция "дорогая" по времени.
 */
 
 
class simpledb {
    protected static $instance;
    private $arDB = array();
    private $sFile = '';
    public function __construct() {
        if (config::getInstance()->get('db')=='simpledb') {
            $sFile = (config::getInstance()->get('dbfile'))?config::getInstance()->get('dbfile'):"simpledb.json";
            $sFile = "./$sFile";
            $this->sFile = $sFile;
            if (file_exists($sFile)) {
                $this->arDB = json_decode(file_get_contents($sFile),true);     
            }
            $iTimer = (config::getInstance()->get('dbautocommit'))?config::getInstance()->get('dbautocommit'):0;
            if ($iTimer>0) {
                timer::getInstance()->createTimer($iTimer,array($this,'commit'));            
            }       
            log::raise("SimpleDB loaded...");
        }
    }


    private function __clone() {

    }

    public static function getInstance() {
        return (self::$instance === null) ?
                self::$instance = new self() :
                self::$instance;
    }
    /**
     * Сохранение данных в постоянное хранилище (файл)
     */
    public function commit() {
         file_put_contents($this->sFile,json_encode($this->arDB));    
         log::raise("SimpleDB commited...");
    }
    /**
     * Получение значения ключа
     * @param string $sKey ключ
     * @return mixed $mixedValue значение ключа
     */
    public function get($sKey) {
        return (isset($this->arDB[$sKey]))?$this->arDB[$sKey]:null;
    }
    /**
     * Сохранение значения ключа
     * @param string $sKey ключ
     * @param mixed $mixedValue значение ключа
     */
    public function set($sKey,$mixedValue) {
        $this->arDB[$sKey] = $mixedValue;
    }
    public function __destruct () {
        $this->commit();
    }
}
